package xjson

import jsoniter "github.com/json-iterator/go"

func IsObject(jsonData []byte) bool {
	return NewIterator(jsonData).IsObject()
}

func IsArray(jsonData []byte) bool {
	return NewIterator(jsonData).IsArray()
}

type JsonIterator struct {
	*jsoniter.Iterator
	valueType jsoniter.ValueType
}

func NewIterator(jsonData []byte) *JsonIterator {
	iter := jsoniter.ParseBytes(jsoniter.ConfigDefault, jsonData)
	val := &JsonIterator{Iterator: iter}
	val.checkJSONTypeOptimized()
	return val
}

func (jti *JsonIterator) IsObject() bool {
	return jti.valueType == jsoniter.ObjectValue
}

func (jti *JsonIterator) IsArray() bool {
	return jti.valueType == jsoniter.ArrayValue
}

func (jti *JsonIterator) checkJSONTypeOptimized() {
	switch jti.Iterator.WhatIsNext() {
	case jsoniter.ArrayValue:
		jti.valueType = jsoniter.ArrayValue
		return
	case jsoniter.ObjectValue:
		jti.valueType = jsoniter.ObjectValue
		return
	default:
		jti.valueType = jsoniter.NilValue
		return // 非集合类型（如字符串/数字等）
	}
}
